﻿using System;


/// <summary>
/// 1. 模式的结构
/// 装饰模式主要包含以下角色。 
/// 抽象构件（Component）角色：定义一个抽象接口以规范准备接收附加责任的对象。
/// 具体构件（Concrete Component）角色：实现抽象构件，通过装饰角色为其添加一些职责。
/// 抽象装饰（Decorator）角色：继承抽象构件，并包含具体构件的实例，可以通过其子类扩展具体构件的功能。
/// 具体装饰（ConcreteDecorator）角色：实现抽象装饰的相关方法，并给具体构件对象添加附加的责任。
/// </summary>
namespace Decorator
{
    class Program
    {
        static void Main(string[] args)
        {
            IComponent p = new ConcreteComponent();
            p.operation();
            Console.WriteLine("---------------------------------");
            IComponent d = new ConcreteDecorator(p);
            d.operation();
            Console.WriteLine("---------------------------------");
            IComponent e = new ConcreteDecorator(d);
            e.operation();
        }
    }

    //抽象构件角色
    interface IComponent
    {
        public void operation();
    }
    //具体构件角色
    class ConcreteComponent : IComponent
    {
        public ConcreteComponent()
        {
            Console.WriteLine("创建具体构件角色");
        }
        public void operation()
        {
            Console.WriteLine("调用具体构件角色的方法operation()");
        }
    }
    //抽象装饰角色
    abstract class Decorator : IComponent
    {
        protected IComponent component;
        public Decorator(IComponent component)
        {
            this.component = component;
        }
        public virtual void operation()
        {
            component.operation();
        }
    }
    //具体装饰角色
    class ConcreteDecorator : Decorator
    {
        public ConcreteDecorator(IComponent component):
            base(component)
        {

        }

        public override void operation()
        {
            component.operation();
            addedFunction();
        }
        public void addedFunction()
        {
            Console.WriteLine("为具体构件角色增加额外的功能addedFunction()");
        }
    }
}
